package com.desire.test;

/**
 * @author LittleDesire
 * @description
 * @date 2022-02-10 周四 9:02
 * @since 17
 */
public class _57_Record记录类型 {


/*
    User.java文件
    public record User(long a) {}

    也可以作为一个成员类
    public class RecordTest{
        public record User(long a){}
    }

    也可以做一个本地类
    public class RecordTest{
        public void test(){
            record Mail(long a){}
            Mail mail = new Mail(12);
        }
    }
 */


    /**
     * Record 要解决的问题最主要的一点就是，让Java适应现代硬件：在 Java 语言发布之初**，
     * 一次内存访问和一次数字计算的消耗时间是差不多的，但是现在，一次内存访问耗时大概是一次数值计算的 200 ~ 1000 倍。
     * 从语言设计上来说，也就是间接访问带来的通过指针获取的需要操作的内存，对于整体性能影响很大。
     * <p>
     * Java 是基于对象的语言，也就是说，Java 是一种基于指针的间接引用的语言。这个基于指针的特性，
     * 给每个对象带来了唯一标识性。例如判断两个 Object 的 ==，其实判断的是两个对象的内存相对映射地址是否相同，
     * 尽管两个对象的 field 完全一样，他们的内存地址也不同。同时这个特性也给对象带来了多态性，易变性还有锁的特性。
     * 但是，并不是所有对象都需要这种特性。
     * <p>
     * 由于指针与间接访问带来了性能瓶颈，Java 准备对于不需要以上提到的特性的对象移除这些特性。于是乎Record 出现了。
     */


    public record User(int id, String name, int score) {
    }

    /**
     * 这样编写代码之后，Record 类默认包含的元素和方法实现包括：
     * record 头指定的组成元素（int id, String name, int age），并且，这些元素都是 final 的。
     * record 默认只有一个构造器，是包含所有元素的构造器。
     * record 的每个元素都有一个对应的 getter（但这种 getter 并不是 getxxx()，而是直接用变量名命名，所以使用序列化框架，DAO 框架都要注意这一点）
     * 实现好的 hashCode()，equals()，toString() 方法（通过自动在编译阶段生成关于 hashCode()，equals()，toString() 方法实现的字节码实现）。
     * 不能用 abstract 修饰 Record 类，会有编译错误。
     * 可以用 final 修饰 Record 类，但是这其实是没有必要的，因为 Record 类本身就是 final 的。
     * 成员 Record 类，还有本地 Record 类，本身就是 static 的，也可以用 static 修饰，但是没有必要。
     * 和普通类一样，Record 类可以被 public, protected, private 修饰，也可以不带这些修饰，这样就是 package-private 的。
     * 和一般类不同的是，Record 类的直接父类不是 java.lang.Object 而是 java.lang.Record。
     * 但是，Record 类不能使用 extends，因为 Record 类不能继承任何类。
     */

    // Record类属性必须在头部声明, 在Record类体中只能声明静态属性
    public record User1(long a) {
        static long age;
    }

    // Record类体可以声明成员方法和静态属性,和一般类一样,但是不能声明abstract或者native方法'
    public record Student(long b) {
        public static void test2() {
        }

        public void test() {
        }
    }

    // Record类体也不能包含实例初始化块
    public record Color(int num) {
        // 报错
     /*   {
            System.out.println();
        }*/
    }
}
